package br.com.controlador;

import br.com.Thread.threadCopiaVendaCaixa;
import br.com.modelo.Operador;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@ManagedBean(name = "loginBean")
@ViewScoped
public class LoginBean implements Serializable {

    private String usuario;
    private String senha;
    private List<Operador> usuarios = new ArrayList<Operador>();
    private Thread t = null;

    @PostConstruct
    public void init() {
        usuarios = Operador.retornaTodosOperadores();
//        if (usuarios.isEmpty()) {
//            try {
//                Operador.adicionaPerfilAndUsuario();
//            } catch (Exception e) {
//                System.out.println("erro:" + e);
//            }
//        }

    }

    public String retornaLogin() {
        return "/login.jsf";
    }

    public String entrar() {
        try {
            //retornar o funcionario com este usuario e senha
            Operador func = Operador.retornaUsuarioPorNomeSenha(usuario, senha);
            //se existir, insere na sessao e vai para o home
            if (func != null && func.getBloqueado().toString().equalsIgnoreCase("S")) {
                String mensagem = "Usuario sem acesso ao sistema\nEntre em contato com seu superior!!";
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, mensagem, "mensagem"));
                return "login.jsf";
            } else if (func != null && func.getBloqueado().toString().equalsIgnoreCase("N")) {
                //adiciona na sessao
                HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
                session.setAttribute("usuarioLogado", func);
                //TODO : aqui é o melhor lugar para a Thread iniciar??
                if (t == null) {
                    threadCopiaVendaCaixa thread = new threadCopiaVendaCaixa();
                    t = new Thread(thread);
                    t.start();
                    threadCopiaVendaCaixa.cont = 1;
                }
                return "index.jsf";
            } else {
                //se nao existir retorna
                String mensagem = "Usuario ou senha invalidos!!";
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, mensagem, "mensagem"));
                return "login.jsf";
            }
        } catch (Exception e) {
            System.out.println("Erro " + e);
            String mensagem = "Erro de conexão com o banco de dados!!";
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, mensagem + ": \n " + e, "mensagem"));
            return "login.jsf";
        }

    }

    public String logOut() {
        //Redireciona o usuario para tela de login efetuando o logout.  
        String loginPage = "/login.jsf";
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        HttpServletRequest request = (HttpServletRequest) context.getRequest();
        try {
            context.redirect(request.getContextPath() + loginPage);
        } catch (IOException e) {
            System.out.println("Erro ao tentar redirecionar para pagina solicitada ao efetuar Logout: " + e.toString());
        }
        HttpSession session = (HttpSession) context.getSession(false);
        session.invalidate();
        return loginPage;
    }

    public String logout() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
        session.invalidate();
        return "login.jsf";
    }

    public boolean exibirMenu(String perfilEsperado) {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        Operador funcSessao = (Operador) session.getAttribute("usuarioLogado");

        Operador funcNovo = Operador.retornaUsuarioPorNomeSenha(funcSessao.getLogin(), funcSessao.getSenha());
        session.setAttribute("usuarioLogado", funcNovo);
        if (funcNovo.getIdEcfFuncionario().getNivelAutorizacao() != null) {
            if (perfilEsperado.equalsIgnoreCase(funcNovo.getIdEcfFuncionario().getNivelAutorizacao().toString())
                    || "administrador".equalsIgnoreCase(funcNovo.getIdEcfFuncionario().getNivelAutorizacao().toString())) {
                return true;
            }
        }
        return false;
    }

    public Boolean verificaSeFuncionarioMesmoQueEstaLogado(Long id) {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        Operador funcSessao = (Operador) session.getAttribute("usuarioLogado");
        if (funcSessao.getId().intValue() == id.intValue()) {
            return false;
        }
        return true;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }
}
